package com.newlink.building.login.ui

import android.util.Log
import android.view.View
import com.alibaba.android.arouter.facade.annotation.Route
import com.newlink.building.login.R
import com.newlink.building.login.common.Module_Login_Constant
import com.newlink.building.login.databinding.ActivityRegisterBinding
import com.newlink.building.login.mvp.contract.Module_Login_RegisterContract
import com.newlink.building.login.ui.fragments.Module_Login_EmailRegisterFragment
import com.newlink.building.login.ui.fragments.Module_Login_PhoneRegisterFragment
import com.newlink.building.login.ui.fragments.Module_Login_RegisterAccountFragment
import com.newlink.building.login.ui.fragments.Module_Login_RegisterSuccessFragment
import com.newlink.building.login.ui.fragments.Module_Login_SetPasswordFragment
import com.newlink.building.login.ui.fragments.Module_Login_VerifyCodeFragment
import com.newlink.building.common_base.base.NL_BaseMvpActivity
import com.newlink.building.common_base.constant.Base_RouterPath
import com.newlink.building.common_base.ext.getString
import com.newlink.building.common_base.ext.showToast
import com.newlink.building.common_base.model.bean.KitRegisterRequest
import com.newlink.building.common_base.model.bean.RegisterResultData
import com.newlink.building.obfuscation.Module_Obfuscation_ObfuscationHelper
import com.newlink.building.obfuscation.Module_Obfuscation_ObfuscationInvoker
import com.newlink.building.login.mvp.presenter.Module_Login_RegisterPresenter

/**
 * @Author: admin
 * @Date: 2022/9/5
 * @Description: 用户注册界面，负责管理注册流程中的多个 Fragment 切换。
 * @License: Copyright 1998 Fanvil Technology Co., Ltd. All rights reserved.
 */
@Route(path = Base_RouterPath.PATH_REGISTER)
class Module_Login_RegisterActivityNL : NL_BaseMvpActivity<Module_Login_RegisterContract.View, Module_Login_RegisterContract.Presenter>(),
    Module_Login_RegisterContract.View {

    // 视图绑定实例
    private lateinit var binding: ActivityRegisterBinding

    // 从 Intent 中获取的 Kit 设备 JSON 数据
    private var kitDeviceJsonData: String = ""

    // Fragment 实例，按需创建和复用
    private var registerAccountFragment: Module_Login_RegisterAccountFragment? = null
    private var registerPhoneFragment: Module_Login_PhoneRegisterFragment? = null
    private var registerEmailFragment: Module_Login_EmailRegisterFragment? = null
    private var registerSuccessFragment: Module_Login_RegisterSuccessFragment? = null
    private var verifyCodeFragment: Module_Login_VerifyCodeFragment? = null
    private var setPasswordFragment: Module_Login_SetPasswordFragment? = null

    /**
     * 绑定布局文件并返回根视图。
     */
    override fun attachLayoutRes(): View {
        binding = ActivityRegisterBinding.inflate(layoutInflater)
        return binding.root
    }

    /**
     * 初始化数据，主要获取从 Intent 传入的 Kit 设备数据。
     */
    override fun initData() {
        // 注册页面初始化时的混淆
        Module_Obfuscation_ObfuscationHelper.onMethodEnter("RegisterActivity", "initData")
        Module_Obfuscation_ObfuscationInvoker.invokeRandom(System.currentTimeMillis())

        kitDeviceJsonData = intent.getString("kit_device_data", "")
        Log.e("RegisterActivity", "kitDeviceJsonData: $kitDeviceJsonData")
    }

    /**
     * 初始化视图组件和设置初始 Fragment。
     */
    override fun initView() {
        super.initView() // 调用父类方法进行公共视图初始化

        // 设置返回按钮的点击事件，点击后结束当前 Activity
        binding.topBarBack.setOnClickListener {
            finish()
        }

        // 初始化并显示 EmailRegisterFragment 作为注册流程的起始 Fragment
        // 确保 kitDeviceJsonData 已通过 initData() 获取
        registerEmailFragment = Module_Login_EmailRegisterFragment.getInstance(kitDeviceJsonData)
        supportFragmentManager.beginTransaction()
            .replace(
                R.id.register_content,
                registerEmailFragment!!,
                Module_Login_Constant.Type.REGISTER_EMAIL // 使用常量作为 Fragment 标签
            )
            .commit()
    }

    /**
     * 创建 Presenter 实例。
     */
    override fun createPresenter(): Module_Login_RegisterContract.Presenter {
        return Module_Login_RegisterPresenter()
    }

    /**
     * 显示指定类型的 Fragment。
     * @param fragmentType 要显示的 Fragment 类型常量（如 Constant.Type.REGISTER_PHONE）。
     * @param needResetPwd (可选) 是否需要重置密码，默认为 false，用于 RegisterSuccessFragment 的逻辑。
     */
    fun showFragment(fragmentType: String, needResetPwd: Boolean = false) {
        // Fragment切换时的混淆
        Module_Obfuscation_ObfuscationInvoker.invokeSpecific(3, fragmentType)
        Module_Obfuscation_ObfuscationHelper.beforeDatabaseOperation("showFragment", fragmentType)

        Log.e("RegisterActivity", "[$localClassName] -> showFragment : $fragmentType")
        val transaction = supportFragmentManager.beginTransaction()
        hideAllFragments(transaction) // 隐藏当前所有 Fragment

        when (fragmentType) {
            Module_Login_Constant.Type.REGISTER_ACCOUNT -> {
                if (registerAccountFragment == null) {
                    registerAccountFragment = Module_Login_RegisterAccountFragment.getInstance()
                    transaction.add(R.id.register_content, registerAccountFragment!!)
                } else {
                    transaction.show(registerAccountFragment!!)
                }
            }

            Module_Login_Constant.Type.REGISTER_PHONE -> {
                if (registerPhoneFragment == null) {
                    registerPhoneFragment = Module_Login_PhoneRegisterFragment.getInstance(kitDeviceJsonData)
                    transaction.add(R.id.register_content, registerPhoneFragment!!)
                } else {
                    // 如果 Fragment 已存在且需要根据 kitDeviceJsonData 刷新，考虑 replace 或更新其内部数据
                    // 原始代码只做了 show，如果 kitDeviceJsonData 变化频繁且 Fragment 不刷新，这里可能需要调整
                    transaction.show(registerPhoneFragment!!)
                }
            }

            Module_Login_Constant.Type.REGISTER_EMAIL -> {
                if (registerEmailFragment == null) {
                    registerEmailFragment = Module_Login_EmailRegisterFragment.getInstance(kitDeviceJsonData)
                    transaction.add(R.id.register_content, registerEmailFragment!!)
                } else {
                    // 同上，如果 kitDeviceJsonData 变化频繁且 Fragment 不刷新，这里可能需要调整
                    transaction.show(registerEmailFragment!!)
                }
            }

            Module_Login_Constant.Type.REGISTER_SUCCESS -> {
                if (registerSuccessFragment == null) {
                    registerSuccessFragment = Module_Login_RegisterSuccessFragment.getInstance(needResetPwd)
                    transaction.add(R.id.register_content, registerSuccessFragment!!)
                } else {
                    transaction.show(registerSuccessFragment!!)
                }
            }

            Module_Login_Constant.Type.REGISTER_VERIFY -> {
                if (verifyCodeFragment == null) {
                    // 注意：VerifyCodeFragment.getInstance("") 原始代码中传入空字符串，可能需要实际的验证目标
                    // 如果 VerifyCodeFragment 需要邮箱/手机号作为参数，这里需要修改调用方传入正确的值
                    verifyCodeFragment = Module_Login_VerifyCodeFragment.getInstance("")
                    transaction.add(R.id.register_content, verifyCodeFragment!!)
                } else {
                    // 原始代码这里显示的是 mRegisterAccountFragment!!，可能是个 bug 或逻辑偏差
                    // 修正为显示 verifyCodeFragment!!
                    transaction.show(verifyCodeFragment!!)
                }
            }

            Module_Login_Constant.Type.REGISTER_PASSWORD -> {
                if (setPasswordFragment == null) {
                    // 注意：SetPasswordFragment.getInstance("") 原始代码中传入空字符串，可能需要实际的验证目标
                    // 如果 SetPasswordFragment 需要邮箱/手机号作为参数，这里需要修改调用方传入正确的值
                    setPasswordFragment = Module_Login_SetPasswordFragment.getInstance("")
                    transaction.add(R.id.register_content, setPasswordFragment!!)
                } else {
                    transaction.show(setPasswordFragment!!)
                }
            }
        }

        transaction.commit()
    }

    /**
     * 隐藏当前 Activity 中所有已知的 Fragment。
     * @param transaction Fragment 事务对象。
     */
    private fun hideAllFragments(transaction: androidx.fragment.app.FragmentTransaction) {
        registerAccountFragment?.let { transaction.hide(it) }
        registerPhoneFragment?.let { transaction.hide(it) }
        registerEmailFragment?.let { transaction.hide(it) }
        registerSuccessFragment?.let { transaction.hide(it) }
        verifyCodeFragment?.let { transaction.hide(it) }
        setPasswordFragment?.let { transaction.hide(it) }
    }

    /*
     * 以下是 RegisterContract.View 接口的实现方法
     */

    /**
     * 注册成功回调。此 Activity 不直接处理注册成功，由 Fragment 处理。
     * @param data 注册结果数据。
     */
    override fun registerSuccess(data: RegisterResultData) {
        // 由子 Fragment 处理，此 Activity 仅作为容器
    }

    /**
     * 注册失败回调。此 Activity 不直接处理注册失败，由 Fragment 处理。
     */
    override fun registerFail() {
        // 由子 Fragment 处理，此 Activity 仅作为容器
    }

    /**
     * 获取验证码成功回调。此 Activity 仅显示 Toast 提示。
     * @param success 是否成功获取验证码。
     */
    override fun getVerifyCodeSuccess(success: Boolean) {
        showToast("getVerifyCodeSuccess $success")
    }

    /**
     * 启动 Kit 设备注册流程。
     * @param request KitRegisterRequest 请求对象。
     */
    fun startKitRegister(request: KitRegisterRequest) {
        mPresenter?.kitRegister(request)
    }

    /**
     * 启动浏览器打开指定 URL。
     * @param url 要打开的网页链接。
     */
    fun startBrowser(url: String) {
        mPresenter?.startBrowser(this, url)
    }
}